package com.briup.cms.util;

import com.briup.cms.exception.CustomException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

public abstract class JwtUtil {
    //签名秘钥 唯一
    private static String signKey = "briup";
    //过期时间(30分钟)
    private static Long expire = 1000 * 60 * 30L;

    /**
     * 生成JWT令牌
     *
     * @param claims JWT第二部分负载 payload中存储的 自定义信息
     * @return JWT字符串
     */
    public static String generateJwt(Map<String, Object> claims) {
        String jwt = Jwts.builder()
                //自定义信息（有效载荷声明）
                .addClaims(claims)
                //签名算法（头部）
                .signWith(SignatureAlgorithm.HS256, signKey)
                //过期时间
                .setExpiration(new
                        Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     *
     * @param jwt JWT字符串(令牌)
     * @return JWT第二部分负载 payload中存储的内容(自定义信息 Map集合)
     * 注意：解析时，令牌无效【1.null 2.签名不匹配 3.过期】，直接抛异常
     */
    public static Claims parseJWT(String jwt) {
        try{
            Claims claims = Jwts.parser()
                    //指定签名秘钥
                    .setSigningKey(signKey)
                    //指定JWT令牌
                    .parseClaimsJws(jwt)
                    .getBody();
            //如果执行到return，说明 令牌校验成功
            return claims;
        }catch (Exception ex){
            ex.printStackTrace();
            //返回一个统一的异常提示信息：
            throw new CustomException(ResultCode.TOKEN_IS_INVALID);
        }
    }

    /**
     * 根据jwt解析用户唯一标识
     * @param jwt
     * @return
     */
    public static String getUserId(String jwt) {
        Claims claims = parseJWT(jwt);
        String userId = (String) claims.get("userId");
        return userId;
    }
}
